package com.ynkbny.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ynkbny.base.PageResult;
import com.ynkbny.domain.DataCodeAnalyzeMapping;
import com.ynkbny.domain.dto.DataCodeAnalyzeMappingDTO;
import com.ynkbny.domain.dto.TEpDataCollectConfigureDTO;
import com.ynkbny.domain.dto.TEpTotalEnergyDTO;
import com.ynkbny.mapper.DatacodeAnalyzeMappingMapper;
import com.ynkbny.service.DatacodeAnalyzeMappingService;
import com.ynkbny.util.SearchUtil;
import lombok.var;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 杨亚
 * @version 1.0.0
 * @title 针对表【datacode_analyze_mapping】的数据库操作Service实现
 * @description 针对表【datacode_analyze_mapping】的数据库操作Service实现
 * @create 2023-11-20 17:08:31
 **/
@Service
public class DatacodeAnalyzeMappingServiceImpl extends ServiceImpl<DatacodeAnalyzeMappingMapper, DataCodeAnalyzeMapping>
        implements DatacodeAnalyzeMappingService {

    @Resource
    private YnBkService ynBkService;

    /**
     * @param conditionJson 高级查询参数
     * @param pageNum       *页
     * @param pageSize      第*页
     * @return 用户分页信息
     */
    @Override
    public PageResult<DataCodeAnalyzeMapping> pageList(String conditionJson, int pageNum, int pageSize) {
        Page<DataCodeAnalyzeMapping> page = new Page<>(pageNum, pageSize);
        QueryWrapper<DataCodeAnalyzeMapping> queryWrapper = SearchUtil.parseWhereSql(null, null, conditionJson);
        return new PageResult<>(this.baseMapper.selectPage(page, queryWrapper));
    }

    /**
     * 根据id查询
     *
     * @param id 采集配置项id
     * @return DataCodeAnalyzeMappingDTO
     */
    @Override
    public DataCodeAnalyzeMappingDTO findById(String id) {
        DataCodeAnalyzeMapping dataCodeAnalyzeMapping = this.baseMapper.selectById(id);
        DataCodeAnalyzeMappingDTO dataCodeAnalyzeMappingDTO = new DataCodeAnalyzeMappingDTO();
        if (!ObjectUtils.isEmpty(dataCodeAnalyzeMapping)) {
            BeanUtils.copyProperties(dataCodeAnalyzeMapping, dataCodeAnalyzeMappingDTO);
        }
        return dataCodeAnalyzeMappingDTO;
    }

    /**
     * 根据社会信用代码查询
     *
     * @param codeList 社会信用代码list
     * @return List<DataCodeAnalyzeMapping>
     */
    @Override
    public List<DataCodeAnalyzeMapping> selectByCode(List<String> codeList) {
        var queryWrapper = new LambdaQueryWrapper<DataCodeAnalyzeMapping>();
        queryWrapper.in(DataCodeAnalyzeMapping::getEnterpriseId, codeList);
        return this.list(queryWrapper);
    }

    /**
     * 获取数值
     *
     * @param jsonObject  json对象
     * @param analyzeName 分析项名称
     * @return 数值
     */
    @Override
    public Double getValue(JSONObject jsonObject, String analyzeName) {
        // 定义一个Double类型的数组，初始值为0.0
        final Double[] value = {0.0};
        // 获取jsonObject中的data属性，并获取R属性
        jsonObject.getJSONObject("data").getJSONArray("R").forEach(item -> {
            // 将item转换为JSONObject
            JSONObject jsonObj = (JSONObject) item;
            // 判断name属性的值是否等于analyzeName
            if (analyzeName.equals(jsonObj.getString("name"))) {
                // 将value属性值赋值给value[0]
                try {
                    value[0] = jsonObj.getDouble("value");
                } catch (Exception e) {
                    value[0] = 0.0;
                }
            }
        });
        // 返回value[0]
        return value[0];
    }

    /**
     * 获取map
     *
     * @return map
     */
    @Override
    public Map<String, Double> getDataMap(List<DataCodeAnalyzeMapping> list) {
        // 创建一个HashMap用于存储数据
        var dataMap = new HashMap<String, Double>();
        // 创建一个HashMap用于存储项目id和JSONObject的映射关系
        var projectIdMap = new HashMap<String, JSONObject>();

        // 遍历list，获取每一个DataCodeAnalyzeMapping对象
        list.forEach(n -> {
            // 创建一个JSONObject对象
            var jsonObject = new JSONObject();
            // 如果分析类型为1，则根据项目id从ynBkService中获取JSONObject
            if ("1".equals(n.getAnalyzeType())) {
                // 如果projectIdMap中包含n.getProjectId，则从projectIdMap中获取JSONObject
                if (projectIdMap.containsKey(n.getProjectId())) {
                    jsonObject = projectIdMap.get(n.getProjectId());
                    // 否则，从ynBkService中获取JSONObject，并将获取到的JSONObject放入projectIdMap中
                } else {
                    jsonObject = ynBkService.getOneDayProjectAnaListBypProjectId(n.getProjectId());
                    projectIdMap.put(n.getProjectId(), jsonObject);
                }
            }
            // 如果分析类型为2，则根据设备id从ynBkService中获取JSONObject
            if ("2".equals(n.getAnalyzeType())) {
                jsonObject = ynBkService.getOneDayDeviceAnaListByDeviceId(n.getAnalyzeId());
            }
            // 获取JSONObject中n.getAnalyzeName的值，并将其赋值给value
            Double value = this.getValue(jsonObject, n.getAnalyzeName());
            // 将n.getId和value放入dataMap中
            dataMap.put(n.getId(), value);
        });
        // 返回dataMap
        return dataMap;
    }


    /**
     * 保存上传数据
     */
    @Override
    public List<TEpTotalEnergyDTO> buildUploadData(Map<String, Double> dataMap, List<TEpDataCollectConfigureDTO> configureDTOList) {
        // 创建一个TEpTotalEnergyDTO类型的列表
        var energyList = new ArrayList<TEpTotalEnergyDTO>();
        // 遍历configureDTOList，将每一个TEpDataCollectConfigureDTO类型的对象赋值给energy
        configureDTOList.forEach(n -> {
            var energy = new TEpTotalEnergyDTO();
            // 使用BeanUtils将n的属性赋值给energy
            BeanUtils.copyProperties(n, energy);
            // 清空采集配置项的端记录索引
            energy.setDataIndex("");
            // 设置energy的转换率
            String energyTypeCode = n.getEnergyTypeCode();
            // 电
            if ("3300".equals(energyTypeCode)) energy.setConvertRation("1.229");
            // 水
            if ("0201".equals(energyTypeCode)) energy.setConvertRation("0.056");
            // 天然气
            if ("1500".equals(energyTypeCode)) energy.setConvertRation("13.3");
            if ("0101".equals(energyTypeCode)) energy.setConvertRation("0.04");
            // 数据有效性1：有效 0：可疑
            energy.setValid("1");
            // 获取当前日期（格式：2023-12-01 00:00:00）
            energy.setStatDate(getStart());
            // 如果dataMap中包含n的dataId，则将dataMap中对应的值赋值给energy的dataValue
            if (dataMap.containsKey(n.getDataId())) {
                try {
                    energy.setDataValue(dataMap.get(n.getDataId()).toString());
                } catch (Exception e) {
                    energy.setDataValue("0");
                }
            }
            // 将energy添加到energyList中
            energyList.add(energy);
        });
        // 返回energyList
        return energyList;
    }

    private static String getStart() {
        // 获取当前日期时间
        LocalDateTime currentDateTime = LocalDateTime.now();
        // 设置时间为当天零点
        LocalDateTime zeroDateTime = currentDateTime.toLocalDate().atStartOfDay();
        // 创建日期时间格式化对象
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 输出格式化日期时间
        return zeroDateTime.format(formatter);
    }

}




